SCI 인터럽트 처리 루틴
easyDSP 는 MCU 의 SCI 통신을 사용하여 PC 와 MCU간 통신을 구현합니다 .따라서 사용자의 MCU프로그램은 easyDSP가 제공하는 SCI 인터럽트 처리 루틴를 포함하여야 합니다 .
관련된 파일은 아래와 같으며, easyDSP가 설치된 폴더의 'source/C28x/DriverLib' 폴더에 위치합니다.
C28x 시리즈
ISR 프로그램 파일
F28001x
F28002x
F28003x
F28004x
F2807x
F2837x
F2838x CPU1 또는 CPU2
F28P55x
F28P65xeasy28x_DriverLib_v11.2. c
easy28x_DriverLib_v11.2. hF2838x CM
easy28x_cm_DriverLib_v10.1.c
easy28x_cm_DriverLib_v10.1.h
ISR 프로그램 파일내의 대표적 함수 이름 및 기능은 하기와 같습니다 .
easyDSP_SCI_Init(void) : SCI통신 채널 초기화
easyDSP_UART_Init (void) : UART통신 채널 초기화 (F2838x의 CM대상 )
easy_RXINT_ISR (void) : RX_INT용 ISR
easyDSP_Boot_Sync(void) : F2837xD, F2838xS, F2838xD 멀티 코어 부팅 및 동기화
사용자의 보드 환경에 맞춰서, 헤더 파일을 수정하셔야 함에 유의하세요 .
예를 들어 아래 선택은 F2807x 사용, easyDSP 통신 bps = 115200 으로 선택한 예제입니다 .
#define F28002x 0
#define F28003x 0
#define F28004x 0
#define F2807x 1
#define F28P65xS 0
#define F28P65xD_CPU1 0
#define F28P65xD_CPU1_CPU2 0
#define F2837xS 0
#define F2837xD_CPU1 0
#define F2837xD_CPU1_CPU2 0
#define F2838xD_CPU1 0
#define F2838xD_CPU1_CM 0
#define BAUDRATE 115200L주의 ) device.h 파일안의 DEVICE_LSPCLK_FREQ 상수값이 사용 시스템에 매칭되어야 합니다. 이 상수는 easyDSP 통신의 SCI 보드레이트 설정에 사용됩니다.
참고로 easyDSP가 통신에 사용하는 모든 변수의 이름은 ezDSP_*와 같은 식의 첨자가 추가되어 있습니다. easyDSP 사용중 ezDSP_로 시작되는 변수 값은 변경하지 마세요 .
인터럽트 네스팅 (Interrupt Nesting) 처리
C28x MCU 에서 하나의 ISR(인터럽트 서비스 루틴)이 수행될 때, 기본적으로는 다른 ISR이 수행될 수 없게 되어 있습니다. 즉, 아무런 조치 없이는, easyDSP용 ISR이 수행될 때, 다른 중요한 사용자의 인터럽트가 수행될 수 없음을 의미합니다. 대부분의 경우 사용자는 리얼타임 제어를 유지하기 위해서, easyDSP ISR 수행여부에 상관없이, easyDSP보다 상위 개념의 인터럽트를 수행시켜야 합니다 .
easyDSP ISR 소스 코드에서는 INT_NESTING_START, INT_NESTING_END를 기본 제공하며, easyDSP ISR의 인터럽트 순위가 최하위로 설정됩니다.
인터럽트간 다양한 우선순위를 구현하기 위해서는 TI에서 예제 파일 (SW Prioritized ISR)를 사용하십시요. 이에 대해서는 하기 링크를 참조하셔서 사용자가 직접 코딩하시기 바랍니다. 즉, 사용자가 직접, easyDSP의 ISR 즉 easy_RXINT_ISR ()의 첫단/마지막단 해당 부분을 수정하셔야 합니다 .
http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x
플래쉬롬 동작시ISR의 빠르고 안정적인 동작을 위해
프로그램이 플래쉬롬에서 작동하는 경우, easyDSP 의 ISR함수의 빠른 동작을 위해서는 해당 코드를 램에서 동작시키는 것이 좋습니다.이를 위해 헤더 파일에서 # progma 를 제공합니다. TI.ramfunc 섹션을 위한 제반 코딩은 TI 자료를 참조하십시오 .
easyDSP 제공 헤더파일 에 하기 선언
#pragma CODE_SECTION(easy_RXINT_ISR, ".TI.ramfunc");
주의사항)특히 작성하신 프로그램이 " 플래쉬에서 동작되는 것이면서 플래쉬를 프로그래밍 "하는 것이라면 easyDSP의 ISR 를 반드시 램에서 동작시켜야 합니다. TI에서 제공되는 각종 flash API 함수가 수행되는 동안에는 flash가 기본적으로 동작하지 않기 때문에 easyDSP ISR 코드가 flash 에서 수행되게 되면 오동작을 하는 것입니다 .
단일 코어 프로그래밍
DSP 프로그램중 초기 부분에 DSP의 인터럽트 (특히 시리얼 인터럽트 부분)를 easyDSP와 통신할 수 있도록 설정해주어야 합니다 . 아래에 사용 예제가 있습니다 . 우선 사용자가 원하는 인터럽트를 설정합니다 .그 후에 easyDSP_SCI_Init()를 호출합니다 .
프로그램 설치 폴더의 source/C28x/DriverLib 폴더안에 main.c 파일을 참조하십시요 .
easyDSP_SCI_Init()에서는
1) SCI관련 레지스터를 easyDSP용도에 맞게 설정
2) SCI 인터럽트를 사용할 수 있도록 관련 레지스터를 설정합니다 .
#include "easy28x_DriverLib_v11.2 .h"
main(void) {// 사용자의 인터럽트 관련 설정 이후, while(1) 이전 호출
easyDSP_SCI_Init();
while(1) {
}
}
싱글 코어 MCU와 동일하게, CPU1/CPU2 모두에 대해서 헤더 파일을 설정하고easyDSP_SCI_Init() 함수를 호출합니다.
다른 부분은 CPU2 또는 CM를 부팅시키고 각 코어간 동기화를 위한 easyDSP_Boot_Sync() 함수입니다.
easyDSP_Boot_Sync() 함수가 호출되면 CPU1 은 CPU2/CM을 부팅시킵니다. 램부팅시에는 CPU2/CM이 부팅되기 까지 CPU1은 기다립니다. 플래쉬롬 부팅시에는 CPU2/CM 에 부팅 지령을 내린 후 바로 CPU1 프로그램이 후속 진행됩니다 .
easyDSP_Boot_Sync() 함수는 CPU1/CPU2 모두에서 호출되어야 하며, 기타 사항은 프로그램 설치 폴더의 source/C28x/driverlib 폴더안에 main.c 파일을 참조하십시요 .
#include "easy28x_DriverLib_v11.2 .h"
main(void) {
Device_init ();
// CPU1 프로그램이라면, easyDSP_Boot_Sync() 호출 이전에
// CPU2, CM에 필요한 공유 메모리를 할당하는 코딩 삽입
// easyDSP_SCI_Init() 이전에 하기 함수 호출
easyDSP_Boot_Sync();
// 사용자의 인터럽트 관련 설정 이후, while(1) 이전 호출
easyDSP_SCI_Init();
while(1) {
}
}
멀티코어
프로그래밍 :
F2838x CM 프로그램
싱글 코어 MCU와 유사하게, 헤더 파일을 설정하고 easyDSP_UART_Init () 함수를 호출합니다.
다른 부분은 CPU1/CM간 동기화를 위한 easyDSP_Boot_Sync() 함수입니다.
기타 사항은 프로그램 설치 폴더의 source/C28x/driverlib 폴더안에 main_cm.c 파일을 참조하십시요 .
#include "easy28x_cm_DriverLib_v10.1.h "
main(void) {
CM_init();
// CM_init() 이후 , easyDSP_UART_Init()이전 호출
easyDSP_Boot_Sync();
easyDSP_UART_Init();
while(1) {
}
}